library(tidyverse)
library(here)
library(spotifyr)
library(viridis)
Carregando pacotes exigidos: viridisLite
theme_set(theme_bw())
Considerando algumas das boybands mais famosas ao longo dos anos, elas apresentam um mesmo molde? Ou seja, a mesma média de tempo / energia / etc?
Boybands são bandas formadas geralmente por meninos adolescentes, e o estilo musical é bem característico, com músicas animadas e dançantes, e algumas baladas. Iremos analisar as principais músicas de várias boybands presentes no Spotify, entre elas as clássicas NSYNC e Backstreet Boys, além do fenômeno kpop BTS. Queremos saber se há um padrão nas características de Tempo, Dançabilidade, Valência e Energia. Tempo é a velocidade ou ritmo de uma música e é medido em batidas por minuto (BPM); Dançabilidade descreve como uma música é adequada para a dança baseada em uma combinação de elementos musicais (quanto mais próximo de 1, mais dançante); Valência mede a positividade da faixa (alta Valência significa mais positiva (por exemplo, felizes, alegres, eufóricas), enquanto baixa valência significa mais negativa (por exemplo, triste, deprimido, zangado); Energia é uma medida de 0 a 1 e representa uma medida de intensidade e atividade. A playlist base pode ser encontrada em: https://open.spotify.com/user/gabimotta15/playlist/47WfTEyFNe64N1OxeQ7xbo?si=g93Ia7niTlKYnjJlrn7dQA
boybands = read_csv(here("data/playlist-boybands.csv"))
Parsed with column specification:
cols(
danceability = col_double(),
energy = col_double(),
key = col_character(),
loudness = col_double(),
mode = col_character(),
speechiness = col_double(),
acousticness = col_double(),
instrumentalness = col_double(),
liveness = col_double(),
valence = col_double(),
tempo = col_double(),
track_uri = col_character(),
duration_ms = col_double(),
time_signature = col_integer(),
key_mode = col_character(),
track_name = col_character(),
album_name = col_character(),
artist = col_character()
)
sumarios = boybands %>%
group_by(artist) %>%
summarise(media_tempo = mean(tempo), media_energia = mean(energy), media_danca = mean(danceability), media_valencia = mean(valence))
b = sumarios %>%
ggplot(aes(y = artist)) +
geom_point(aes(x = media_energia, color = "Energia")) +
geom_point(aes(x = media_danca, color = "Dançabilidade")) +
geom_point(aes(x = media_valencia, color = "Valência")) +
labs(x = "Médias dos Atributos", y = "Artista" , color = "Atributo")
plotly::ggplotly(b)
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
A maioria das boybands apresenta um padrão de média de Energia acima de 0.7, e média de Dançabilidade entre 0.5 e 0.7. Apenas a Valência se destaca, tendo bandas muito positivas como Menudo (quase 0.8 de Valência), e bandas muito negativas como The Wanted (abaixo de 0.4).
p = boybands %>%
mutate(faixa = paste(track_name, album_name)) %>%
ggplot(aes(x = artist,
color = artist,
label = faixa,
y = tempo)) +
geom_point() +
geom_line() +
scale_x_discrete(labels = abbreviate) +
labs(x = "Artista", y = "Tempo (BPM)" , color = "Artista")
plotly::ggplotly(p)
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
Em relação ao Tempo, é possível observar uma grande variação entre as bandas, portanto não há um padrão específico. Existem bandas com um espaçamento de Tempo bem pequeno como a coreana SHINee, e outras bem espalhadas ao longo da escala como McFly.
Como é a concentração de Energia e Valência das boybands de KPop e música Latina?
As músicas coreanas e latinas possuem ritmos fortes, portanto vamos observar o comportamento das bandas BTS, CNCO, Menudo e SHINee.
p = boybands %>%
filter(artist == "BTS" | artist == "CNCO" | artist == "Menudo" | artist == "SHINee") %>%
mutate(faixa = paste(track_name, album_name)) %>%
ggplot(aes(x = energy,
group = artist,
label = track_name,
y = valence)) +
stat_density2d(aes(fill=..level..), geom="polygon", n = 100, h = .25) +
scale_fill_viridis() +
facet_wrap(~artist) +
scale_x_continuous(limits = c(-.05, 1.05)) +
scale_y_continuous(limits = c(-.05, 1.05)) +
theme(legend.position = "None") +
labs(x = "Energia",
y = "Valência")
plotly::ggplotly(p)
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
As músicas dessas bandas estão mais concentradas em altos níveis de Energia e Valência, logo são animadas e positivas.
Lady Gaga possui álbuns de vários estilos, o Tempo varia muito para cada álbum?
Lady Gaga é uma artista muito talentosa, ganhou vários prêmios com seus álbuns, que vão do pop ao jazz. Como é o comportamento do Tempo nesses álbuns? Tempo é a velocidade ou ritmo de uma música e é medido em batidas por minuto (BPM). Como os estilos musicais mudam, é esperado que haja uma variação nesse Tempo. Para essa análise serão desconsiderados singles e álbuns promocionais. A playlist base pode ser encontrada em: https://open.spotify.com/user/gabimotta15/playlist/7pH3kwz0vVTgmKt2cR7Z9o?si=JcvkobZXSkKBCE13ubsM7w
gaga = read_csv(here("data/playlist_gaga.csv"))
mlabels <- c("ARTPOP","Born This Way", "Cheek to Cheek", "Joanne", "The Fame", "The Fame Monster")
g = gaga %>%
mutate(faixa = paste(track_name)) %>%
ggplot(aes(x = album_name,
label = faixa,
y = tempo)) +
geom_point(size = .8, alpha = .8) +
labs(x = "Álbum", y = "Tempo (BPM)", color="Álbum") +
scale_x_discrete(labels=mlabels)
plotly::ggplotly(g)
Podemos perceber que os Tempos estão geralmente concentrados entre 100 e 140 BPM, mas existe uma dispersão maior nos álbuns Cheek to Cheek e Joanne, que são os álbuns de estilos mais diferentes dos outros. Portanto o Tempo não varia muito entre os álbuns mais pop, apenas nos álbuns de jazz e country.
LS0tDQp0aXRsZTogIlByb2IyQ1AzOiBVbWEgYW7DoWxpc2Ugc3VhIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoc3BvdGlmeXIpDQpsaWJyYXJ5KHZpcmlkaXMpDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCmBgYA0KDQojIENvbnNpZGVyYW5kbyBhbGd1bWFzIGRhcyBib3liYW5kcyBtYWlzIGZhbW9zYXMgYW8gbG9uZ28gZG9zIGFub3MsIGVsYXMgYXByZXNlbnRhbSB1bSBtZXNtbyBtb2xkZT8gT3Ugc2VqYSwgYSBtZXNtYSBtw6lkaWEgZGUgdGVtcG8gLyBlbmVyZ2lhIC8gZXRjPw0KDQpCb3liYW5kcyBzw6NvIGJhbmRhcyBmb3JtYWRhcyBnZXJhbG1lbnRlIHBvciBtZW5pbm9zIGFkb2xlc2NlbnRlcywgZSBvIGVzdGlsbyBtdXNpY2FsIMOpIGJlbSBjYXJhY3RlcsOtc3RpY28sIGNvbSBtw7pzaWNhcyBhbmltYWRhcyBlIGRhbsOnYW50ZXMsIGUgYWxndW1hcyBiYWxhZGFzLiBJcmVtb3MgYW5hbGlzYXIgYXMgcHJpbmNpcGFpcyBtw7pzaWNhcyBkZSB2w6FyaWFzIGJveWJhbmRzIHByZXNlbnRlcyBubyBTcG90aWZ5LCBlbnRyZSBlbGFzIGFzIGNsw6Fzc2ljYXMgTlNZTkMgZSBCYWNrc3RyZWV0IEJveXMsIGFsw6ltIGRvIGZlbsO0bWVubyBrcG9wIEJUUy4gUXVlcmVtb3Mgc2FiZXIgc2UgaMOhIHVtIHBhZHLDo28gbmFzIGNhcmFjdGVyw61zdGljYXMgZGUgVGVtcG8sIERhbsOnYWJpbGlkYWRlLCBWYWzDqm5jaWEgZSBFbmVyZ2lhLg0KVGVtcG8gw6kgYSB2ZWxvY2lkYWRlIG91IHJpdG1vIGRlIHVtYSBtw7pzaWNhIGUgw6kgbWVkaWRvIGVtIGJhdGlkYXMgcG9yIG1pbnV0byAoQlBNKTsNCkRhbsOnYWJpbGlkYWRlIGRlc2NyZXZlIGNvbW8gdW1hIG3DunNpY2Egw6kgYWRlcXVhZGEgcGFyYSBhIGRhbsOnYSBiYXNlYWRhIGVtIHVtYSBjb21iaW5hw6fDo28gZGUgZWxlbWVudG9zIG11c2ljYWlzIChxdWFudG8gbWFpcyBwcsOzeGltbyBkZSAxLCBtYWlzIGRhbsOnYW50ZSk7DQpWYWzDqm5jaWEgbWVkZSBhIHBvc2l0aXZpZGFkZSBkYSBmYWl4YSAoYWx0YSBWYWzDqm5jaWEgc2lnbmlmaWNhIG1haXMgcG9zaXRpdmEgKHBvciBleGVtcGxvLCBmZWxpemVzLCBhbGVncmVzLCBldWbDs3JpY2FzKSwgZW5xdWFudG8gYmFpeGEgdmFsw6puY2lhIHNpZ25pZmljYSBtYWlzIG5lZ2F0aXZhIChwb3IgZXhlbXBsbywgdHJpc3RlLCBkZXByaW1pZG8sIHphbmdhZG8pOw0KRW5lcmdpYSDDqSB1bWEgbWVkaWRhIGRlIDAgYSAxIGUgcmVwcmVzZW50YSB1bWEgbWVkaWRhIGRlIGludGVuc2lkYWRlIGUgYXRpdmlkYWRlLg0KQSBwbGF5bGlzdCBiYXNlIHBvZGUgc2VyIGVuY29udHJhZGEgZW06IGh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS91c2VyL2dhYmltb3R0YTE1L3BsYXlsaXN0LzQ3V2ZURXlGTmU2NE4xT3hlUTd4Ym8/c2k9ZzkzSWE3bmlUbEtZbmpKbHJuN2RRQQ0KDQpgYGB7cn0NCmJveWJhbmRzID0gcmVhZF9jc3YoaGVyZSgiZGF0YS9wbGF5bGlzdC1ib3liYW5kcy5jc3YiKSkNCmBgYA0KYGBge3J9DQpzdW1hcmlvcyA9IGJveWJhbmRzICU+JSANCiAgICBncm91cF9ieShhcnRpc3QpICU+JQ0KICAgIHN1bW1hcmlzZShtZWRpYV90ZW1wbyA9IG1lYW4odGVtcG8pLCBtZWRpYV9lbmVyZ2lhID0gbWVhbihlbmVyZ3kpLCBtZWRpYV9kYW5jYSA9IG1lYW4oZGFuY2VhYmlsaXR5KSwgbWVkaWFfdmFsZW5jaWEgPSBtZWFuKHZhbGVuY2UpKQ0KYGBgDQoNCmBgYHtyfQ0KDQpiID0gc3VtYXJpb3MgJT4lIA0KICAgIGdncGxvdChhZXMoeSA9IGFydGlzdCkpICsgDQogICAgZ2VvbV9wb2ludChhZXMoeCA9IG1lZGlhX2VuZXJnaWEsIGNvbG9yID0gIkVuZXJnaWEiKSkgKyANCiAgICBnZW9tX3BvaW50KGFlcyh4ID0gbWVkaWFfZGFuY2EsIGNvbG9yID0gIkRhbsOnYWJpbGlkYWRlIikpICsNCiAgICBnZW9tX3BvaW50KGFlcyh4ID0gbWVkaWFfdmFsZW5jaWEsIGNvbG9yID0gIlZhbMOqbmNpYSIpKSArDQogICAgbGFicyh4ID0gIk3DqWRpYXMgZG9zIEF0cmlidXRvcyIsIHkgPSAiQXJ0aXN0YSIgLCBjb2xvciA9ICJBdHJpYnV0byIpDQoNCnBsb3RseTo6Z2dwbG90bHkoYikNCmBgYA0KDQpBIG1haW9yaWEgZGFzIGJveWJhbmRzIGFwcmVzZW50YSB1bSBwYWRyw6NvIGRlIG3DqWRpYSBkZSBFbmVyZ2lhIGFjaW1hIGRlIDAuNywgZSBtw6lkaWEgZGUgRGFuw6dhYmlsaWRhZGUgZW50cmUgMC41IGUgMC43LiBBcGVuYXMgYSBWYWzDqm5jaWEgc2UgZGVzdGFjYSwgdGVuZG8gYmFuZGFzIG11aXRvIHBvc2l0aXZhcyBjb21vIE1lbnVkbyAocXVhc2UgMC44IGRlIFZhbMOqbmNpYSksIGUgYmFuZGFzIG11aXRvIG5lZ2F0aXZhcyBjb21vIFRoZSBXYW50ZWQgKGFiYWl4byBkZSAwLjQpLg0KDQpgYGB7ciBmaWcud2lkdGg9OX0NCnAgPSBib3liYW5kcyAlPiUgDQogICAgbXV0YXRlKGZhaXhhID0gcGFzdGUodHJhY2tfbmFtZSwgYWxidW1fbmFtZSkpICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBhcnRpc3QsDQogICAgICAgICAgICAgICBjb2xvciA9IGFydGlzdCwNCiAgICAgICAgICAgICAgIGxhYmVsID0gZmFpeGEsDQogICAgICAgICAgICAgICB5ID0gdGVtcG8pKSArIA0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2VvbV9saW5lKCkgKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYWJicmV2aWF0ZSkgKw0KICAgIGxhYnMoeCA9ICJBcnRpc3RhIiwgeSA9ICJUZW1wbyAoQlBNKSIgLCBjb2xvciA9ICJBcnRpc3RhIikNCg0KcGxvdGx5OjpnZ3Bsb3RseShwKQ0KYGBgDQpFbSByZWxhw6fDo28gYW8gVGVtcG8sIMOpIHBvc3PDrXZlbCBvYnNlcnZhciB1bWEgZ3JhbmRlIHZhcmlhw6fDo28gZW50cmUgYXMgYmFuZGFzLCBwb3J0YW50byBuw6NvIGjDoSB1bSBwYWRyw6NvIGVzcGVjw61maWNvLiBFeGlzdGVtIGJhbmRhcyBjb20gdW0gZXNwYcOnYW1lbnRvIGRlIFRlbXBvIGJlbSBwZXF1ZW5vIGNvbW8gYSBjb3JlYW5hIFNISU5lZSwgZSBvdXRyYXMgYmVtIGVzcGFsaGFkYXMgYW8gbG9uZ28gZGEgZXNjYWxhIGNvbW8gTWNGbHkuDQoNCiMjIENvbW8gw6kgYSBjb25jZW50cmHDp8OjbyBkZSBFbmVyZ2lhIGUgVmFsw6puY2lhIGRhcyBib3liYW5kcyBkZSBLUG9wIGUgbcO6c2ljYSBMYXRpbmE/DQpBcyBtw7pzaWNhcyBjb3JlYW5hcyBlIGxhdGluYXMgcG9zc3VlbSByaXRtb3MgZm9ydGVzLCBwb3J0YW50byB2YW1vcyBvYnNlcnZhciBvIGNvbXBvcnRhbWVudG8gZGFzIGJhbmRhcyBCVFMsIENOQ08sIE1lbnVkbyBlIFNISU5lZS4NCg0KYGBge3J9DQpwID0gYm95YmFuZHMgJT4lIA0KICAgIGZpbHRlcihhcnRpc3QgPT0gIkJUUyIgfCBhcnRpc3QgPT0gIkNOQ08iIHwgYXJ0aXN0ID09ICJNZW51ZG8iIHwgYXJ0aXN0ID09ICJTSElOZWUiKSAlPiUNCiAgICBtdXRhdGUoZmFpeGEgPSBwYXN0ZSh0cmFja19uYW1lLCBhbGJ1bV9uYW1lKSkgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGVuZXJneSwgDQogICAgICAgICAgICAgICBncm91cCA9IGFydGlzdCwNCiAgICAgICAgICAgICAgIGxhYmVsID0gdHJhY2tfbmFtZSwNCiAgICAgICAgICAgICAgIHkgPSB2YWxlbmNlKSkgKyANCiAgICBzdGF0X2RlbnNpdHkyZChhZXMoZmlsbD0uLmxldmVsLi4pLCBnZW9tPSJwb2x5Z29uIiwgbiA9IDEwMCwgaCA9IC4yNSkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgIA0KICAgIGZhY2V0X3dyYXAofmFydGlzdCkgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtLjA1LCAxLjA1KSkgKyANCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtLjA1LCAxLjA1KSkgKyANCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiTm9uZSIpICsgDQogICAgbGFicyh4ID0gIkVuZXJnaWEiLCANCiAgICAgICAgIHkgPSAiVmFsw6puY2lhIikNCnBsb3RseTo6Z2dwbG90bHkocCkNCmBgYA0KQXMgbcO6c2ljYXMgZGVzc2FzIGJhbmRhcyBlc3TDo28gbWFpcyBjb25jZW50cmFkYXMgZW0gYWx0b3MgbsOtdmVpcyBkZSBFbmVyZ2lhIGUgVmFsw6puY2lhLCBsb2dvIHPDo28gYW5pbWFkYXMgZSBwb3NpdGl2YXMuDQoNCiMgTGFkeSBHYWdhIHBvc3N1aSDDoWxidW5zIGRlIHbDoXJpb3MgZXN0aWxvcywgbyBUZW1wbyB2YXJpYSBtdWl0byBwYXJhIGNhZGEgw6FsYnVtPw0KDQpMYWR5IEdhZ2Egw6kgdW1hIGFydGlzdGEgbXVpdG8gdGFsZW50b3NhLCBnYW5ob3UgdsOhcmlvcyBwcsOqbWlvcyBjb20gc2V1cyDDoWxidW5zLCBxdWUgdsOjbyBkbyBwb3AgYW8gamF6ei4gQ29tbyDDqSBvIGNvbXBvcnRhbWVudG8gZG8gVGVtcG8gbmVzc2VzIMOhbGJ1bnM/IFRlbXBvIMOpIGEgdmVsb2NpZGFkZSBvdSByaXRtbyBkZSB1bWEgbcO6c2ljYSBlIMOpIG1lZGlkbyBlbSBiYXRpZGFzIHBvciBtaW51dG8gKEJQTSkuIENvbW8gb3MgZXN0aWxvcyBtdXNpY2FpcyBtdWRhbSwgw6kgZXNwZXJhZG8gcXVlIGhhamEgdW1hIHZhcmlhw6fDo28gbmVzc2UgVGVtcG8uIFBhcmEgZXNzYSBhbsOhbGlzZSBzZXLDo28gZGVzY29uc2lkZXJhZG9zIHNpbmdsZXMgZSDDoWxidW5zIHByb21vY2lvbmFpcy4NCkEgcGxheWxpc3QgYmFzZSBwb2RlIHNlciBlbmNvbnRyYWRhIGVtOiBodHRwczovL29wZW4uc3BvdGlmeS5jb20vdXNlci9nYWJpbW90dGExNS9wbGF5bGlzdC83cEgza3d6MHZWVGdtS3QyY1I3WjlvP3NpPUpjdmtvYlpYU2tLQkNFMTN1YnNNN3cNCg0KYGBge3J9DQpnYWdhID0gcmVhZF9jc3YoaGVyZSgiZGF0YS9wbGF5bGlzdF9nYWdhLmNzdiIpKQ0KYGBgDQoNCmBgYHtyfQ0KbWxhYmVscyA8LSBjKCJBUlRQT1AiLCJCb3JuIFRoaXMgV2F5IiwgIkNoZWVrIHRvIENoZWVrIiwgIkpvYW5uZSIsICJUaGUgRmFtZSIsICJUaGUgRmFtZSBNb25zdGVyIikNCg0KZyA9IGdhZ2EgJT4lIA0KICAgIG11dGF0ZShmYWl4YSA9IHBhc3RlKHRyYWNrX25hbWUpKSAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gYWxidW1fbmFtZSwNCiAgICAgICAgICAgICAgIGxhYmVsID0gZmFpeGEsDQogICAgICAgICAgICAgICB5ID0gdGVtcG8pKSArIA0KICAgIGdlb21fcG9pbnQoc2l6ZSA9IC44LCBhbHBoYSA9IC44KSArDQogICAgbGFicyh4ID0gIsOBbGJ1bSIsIHkgPSAiVGVtcG8gKEJQTSkiLCBjb2xvcj0iw4FsYnVtIikgKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPW1sYWJlbHMpDQoNCnBsb3RseTo6Z2dwbG90bHkoZykNCmBgYA0KDQpQb2RlbW9zIHBlcmNlYmVyIHF1ZSBvcyBUZW1wb3MgZXN0w6NvIGdlcmFsbWVudGUgY29uY2VudHJhZG9zIGVudHJlIDEwMCBlIDE0MCBCUE0sIG1hcyBleGlzdGUgdW1hIGRpc3BlcnPDo28gbWFpb3Igbm9zIMOhbGJ1bnMgQ2hlZWsgdG8gQ2hlZWsgZSBKb2FubmUsIHF1ZSBzw6NvIG9zIMOhbGJ1bnMgZGUgZXN0aWxvcyBtYWlzIGRpZmVyZW50ZXMgZG9zIG91dHJvcy4gUG9ydGFudG8gbyBUZW1wbyBuw6NvIHZhcmlhIG11aXRvIGVudHJlIG9zIMOhbGJ1bnMgbWFpcyBwb3AsIGFwZW5hcyBub3Mgw6FsYnVucyBkZSBqYXp6IGUgY291bnRyeS4NCg0KIyMgT3Mgw6FsYnVucyBjb20gbWFpb3IgdmFyaWHDp8OjbyBkZSBUZW1wbyBzw6NvIGFjw7pzdGljb3M/DQoNClF1YW50byBtYWlzIHByw7N4aW1vIGRlIDEgw6kgbyBuw612ZWwgZGUgYWPDunN0aWNhLCBtYWlzIHByb3bDoXZlbCDDqSBxdWUgYSBtw7pzaWNhIHNlamEgYWPDunN0aWNhLiBNw7pzaWNhcyBhY8O6c3RpY2FzIGdlcmFsbWVudGUgc8OjbyBtYWlzIGxlbnRhcywgcG9ydGFudG8gcG9zc3VlbSBtZW5vciBUZW1wby4gTmEgYW7DoWxpc2UgYW50ZXJpb3Igb3Mgw6FsYnVucyBKb2FubmUgZSBDaGVlayB0byBDaGVlayBzZSBkZXN0YWNhcmFtIHBvciBuw6NvIGVzdGFyIGV4Y2x1c2l2YW1lbnRlIG5hIGZhaXhhIGRvcyAxMDAgYSAxNDAgQlBNLCBlIHNlcsOjbyBvYnNlcnZhZG9zIGFnb3JhIGVtIHJlbGHDp8OjbyDDoCBhY8O6c3RpY2EuDQoNCmBgYHtyfQ0KZyA9IGdhZ2EgJT4lIA0KICAgIGZpbHRlcihhbGJ1bV9uYW1lID09ICJDaGVlayBUbyBDaGVlayAoRGVsdXhlKSIgfCBhbGJ1bV9uYW1lID09ICJKb2FubmUgKERlbHV4ZSkiKSAlPiUNCiAgICBtdXRhdGUoZmFpeGEgPSBwYXN0ZSh0cmFja19uYW1lKSkgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGFjb3VzdGljbmVzcywNCiAgICAgICAgICAgICAgIGxhYmVsID0gZmFpeGEsDQogICAgICAgICAgICAgICBjb2xvciA9IGFsYnVtX25hbWUsDQogICAgICAgICAgICAgICB5ID0gdGVtcG8pKSArIA0KICAgIGdlb21fcG9pbnQoc2l6ZSA9IC44LCBhbHBoYSA9IC44KSArDQogICAgbGFicyh4ID0gIkFjw7pzdGljYSIsIHkgPSAiVGVtcG8gKEJQTSkiLCBjb2xvciA9ICLDgWxidW0iKQ0KDQpwbG90bHk6OmdncGxvdGx5KGcpDQpgYGANCg0KVmVtb3MgcXVlIG8gw6FsYnVtIENoZWVrIHRvIENoZWVrIMOpIHF1YXNlIHRvdGFsbWVudGUgYWPDunN0aWNvLCB0b2RhcyBhcyBtw7pzaWNhcyBlc3TDo28gYWNpbWEgZGUgMC41IG5vIG7DrXZlbCBkZSBhY8O6c3RpY2EsIGVucXVhbnRvIG8gSm9hbm5lIGVzdMOhIGJlbSBwcsOzeGltbyBkZSAwLiBBcyBmYWl4YXMgQW5nZWwgRG93biBlIE1pbGxpb24gUmVhc29ucyBzw6NvIHRvY2FkYXMgbm8gcGlhbm8gZSBubyB2aW9sw6NvLCBwb3IgaXNzbyBhcHJlc2VudGFtIG1haW9yIGFjw7pzdGljYSBxdWUgYXMgb3V0cmFzIGZhaXhhcyBkbyBKb2FubmUu